<?php
/**
 * 错误处理
 */
error_reporting(E_ALL); //E_ALL
set_error_handler('customError');

/**
 * 自定义错误处理，不能处理
 * 以下级别的错误不能由用户定义的函数来处理：
 * E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING
 * 如果错误发生在脚本执行之前（比如文件上传时），将不会 调用自定义的错误处理程序因为它尚未在那时注册。
 * @access  public
 * @author  Lu Shaoming<lushao1012@163.com>
 * @param $errno    错误编号
 * @param $errstr   错误信息
 * @param $errfile  出错文件
 * @param $errline  出错行
 */
function customError($errno, $errstr, $errfile, $errline)
{
    $msg = '';
    $msg1 = "<b>System Error:</b> [$errno] $errstr  in <b>$errfile</b> on line <b>$errline</b><br>";

    // 错误输出代码的前5行至后五行，并在出错行着重标出
    $arr = file($errfile);
    if ($errline < 5) {//出错行在前5行
        $begin_line = 0;
    } else {
        $begin_line = $errline - 6;
    }

    for ($i = $begin_line; $i< $errline-1; $i++) {
        $msg .= ($i+1).$arr[$i] . '<br>';
    }

    if ($errline > count($arr) - 6) {
        $end_line = count($arr);
    } else {
        $end_line = $errline + 5;
    }

    for ($i = $errline-1; $i< $end_line; $i++) {
        if($i == $errline-1) {
            $msg .= '<span style="background-color: burlywood;">'.($i+1).$arr[$i] . '<br></span>';
        } else {
            $msg .= ($i+1).$arr[$i] . '<br>';
        }
    }

    $log_dir = APP_PATH.'runtime';

    if(!is_dir($log_dir)){
        mkdir($log_dir);
    }
    // 保存错误日志
    $save_msg =  date('Y-m-d H:i:s').': System Error: '.$errstr.'. Error occur in file '.$errfile.' in line '.$errline.PHP_EOL;
    file_put_contents($log_dir.'/log.txt', $save_msg ,FILE_APPEND);

    if(APP_DEBUG === true) { //开启调试模式时才输出错误信息
        echo $msg1.'<pre>'.$msg.'</pre>';
    } else {
        echo '系统发生错误，请稍后再试！';
        exit;
    }

}
